// 增加then方法 then((value)=>{ // value为resolve的参数 }, (errMsg)=>{ //errMsg为reject的参数 })
// 调用then的时候，要判断状态，根据状态来调用then参数中的函数

// 维护三种状态
const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECTED = 'rejected';

class MyPromise {


  // executor 执行器函数，参数为resolve函数，reject函数
  constructor(executor) { //executor立即执行
    executor(this.resolve, this.reject);
  }

  status = PENDING;// 默认状态
  value = undefined;//成功之后的值 - 使用方传入
  reason = undefined;//失败的原因 - 使用方传入
  // 直接调用一个函数(不使用点调用)，那么该函数中的this指向window或undefiend
  // 注意：函数作为类的属性，通常使用箭头函数,这样，直接调用函数时(不使用点调用)，该函数中的this就始终指向该对象的实例
  resolve = value => {
    this.value = value;
    // 保证状态只能被修改一次
    if (this.status !== PENDING) {
      return;
    }
    this.status = FULFILLED;
  };
  reject = reason => {
    this.reason = reason;
    // 保证状态只能被修改一次
    if (this.status !== PENDING) {
      return;
    }
    this.status = REJECTED;
  };

  // then是被定义在原型对象中的，在对象的原型对象中定义函数then的写法: then(){} ; 非箭头函数
  then(successCallback, failCallback) {
    if (this.status === FULFILLED) {
      successCallback(this.value);
    } else if (this.status === REJECTED) {
      failCallback(this.reason);
    }
  }
}

module.exports = MyPromise;